package com.demo.understandmvc.控制器增强.exceptionHandler;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ExceptionController {

	// 这时发生异常时返回的状态码依然是200，这不符合http的规范，此时需要使用@ResponseStatus解决这个问题
	@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
	@ExceptionHandler(Exception.class)
	// 即可处理该类型与其所有子类型的异常
	public String exceptionHandler(Exception e) {
		System.out.println(e.getMessage());
		return e.getMessage();
	}

	@GetMapping("/exception")
	public String exceptionHandler() throws Exception {
		System.out.println("throw exception");
		throw new Exception("throw exception");
	}

	// 使用@ResponseStatus时要注意：
	// 1、该注解不仅可以标注异常处理方法，也可以标注处理器方法，当标记处理器方法时，该处理器方法返回的响应状态码会取注解中状态码。但如果返回的结果为包含响应状态码的类型且其中的状态码不为空
	// 则以返回结果中的状态码为准
	// 2、当提供reason属性时，无论是异常处理方法还是处理器方法，返回值都会无效，因为此请求会被转发到Servlet容器中响应状态码对应的页面去渲染，不再经过返回值处理器去处理了。对于springboot
	// 项目来说，默认会被转发到/error路径去处理对应类型的错误。
	// 3、该注解还可以标记在自己定义的异常类上，此时如果处理器中抛出此异常，则会按照异常类上的该注解返回响应状态码与异常原因

}
